package zhongbo.java.air.task;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import zhongbo.java.air.dictionary.mapper.AirCraftMapper;
import zhongbo.java.air.dictionary.model.AirCraft;
import zhongbo.java.air.mapper.FlightActivityDailyMapper;
import zhongbo.java.air.model.FlightActivityDaily;

import java.util.Date;
import java.util.List;

/**
 * 说明：
 *
 * @author 钟波dellNotebook
 * @since 2025年04月08日 星期二 04:12:59
 */
@Component
@Slf4j
public class AircraftActivityTask {

    @Autowired
    private FlightActivityDailyMapper flightActivityDailyMapper;
    @Autowired
    private AirCraftMapper airCraftMapper;

    // 每10分钟执行（注意配置时区）
    @Scheduled(
            // 开发中可设置短一点, 这里设置5分钟
            fixedDelay = 5 * 60 * 1000
            // 启动后等多少毫秒, 执行第一次定时任务, 这里设置5秒
            , initialDelay = 5000
    )
    public void updateDailyActivity() {
        log.info("---- 执行定时任务 -----");
        doJob();
    }

    private void doJob() {
        String today = DateUtil.formatDate(new Date());
        // 1. 从轨迹表查询当天出现过的ICAO码（需实现轨迹表查询逻辑）
        List<FlightActivityDaily> activeICaos = flightActivityDailyMapper.selectDailyStats(today);
        log.info("查询结果: {}条", activeICaos.size());
        // 2. 批量插入或更新
        // todo 周二任务: 存入数据库. 存入之前先icao+date两个字段, 判断数据库是否已有数据, 有的话则是更新
        // 2. 批量插入或更新
        for (FlightActivityDaily activity : activeICaos) {
            String icaoCode = activity.getIcaoCode();
            Date date = activity.getDate();
            QueryWrapper<AirCraft>wrapper=new QueryWrapper<>();
            wrapper.eq("icao_code", icaoCode);
//            Date dateBefore = new Date();
//            String todayDate = DateUtil.formatDate(dateBefore);
            List<AirCraft>aircraft=airCraftMapper.selectList(wrapper);
//            if(aircraft.isEmpty()){
//                // 没有数据，新增
//            }else{
//                // 有数据，更新
//                AirCraft airCraft = aircraft.get(0);
//                String id = airCraft.getId();
//                activity.setId(id);
//                airCraftMapper.insert(activity);
//            }
            for (AirCraft airCraft : aircraft) {
                if (airCraft != null) {
                    // 如果有结果，则补充 registration, airline, aircraft_type 三个字段
                    activity.setRegistration(airCraft.getRegistration());
                    activity.setAirline(airCraft.getAirline());
                    activity.setAircraftType(airCraft.getAircraftType());
                    flightActivityDailyMapper.insert(activity);
                    log.info("补充飞机信息: ICAO={}, Registration={}, Airline={}, AircraftType={}",
                            icaoCode, airCraft.getRegistration(), airCraft.getAirline(), airCraft.getAircraftType());
                } else {
                    flightActivityDailyMapper.insert(activity);
                    log.info("未找到 ICAO={} 的飞机信息", icaoCode);
                }
            }

            // 检查数据库中是否已存在该 ICAO 码和日期的记录
            QueryWrapper<FlightActivityDaily>FlightActivity=new QueryWrapper<>();
            FlightActivity.eq("icao_code",icaoCode);
            FlightActivity.eq("date",date);
            List<FlightActivityDaily> QueryW=flightActivityDailyMapper.selectList(FlightActivity);
            if (QueryW !=null) {
                // 如果存在记录，则更新
                flightActivityDailyMapper.updateById(activity);
                log.info("更新记录: ICAO={}, 日期={}", icaoCode, date);
            } else {
                // 如果不存在记录，则插入
                flightActivityDailyMapper.insert(activity);
                log.info("新增记录: ICAO={}, 日期={}", icaoCode, date);
            }
        }

        log.info("当天的航班活动数据处理完成");
    }

}
